﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Resources;
using Cesave.Domain.Core;
using System.Data;

namespace Cesave.Domain.PermisosModule.Contracts.Usuarios
{
	public class UsuarioService
		: IUsuarioService
	{
		#region Private properties

		/// <summary>
		/// 
		/// </summary>
		private IUsuarioRepository _usuarioRepository;

		#endregion

		#region Constructor

		/// <summary>
		/// 
		/// </summary>
		/// <param name="usuarioRepository"></param>
		public UsuarioService(IUsuarioRepository usuarioRepository)
		{
			if (usuarioRepository == null)
				throw new ArgumentNullException(Messages.exception_DependenciesAreNotInitialized, "usuarioRepository");
			_usuarioRepository = usuarioRepository;
		}

		#endregion

		#region IUsuarioService Members

		/// <summary>
		/// 
		/// </summary>
		/// <param name="usuario"></param>
		public void AddUsuario(Entities.Usuario usuario)
		{
			if (usuario == null)
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "usuario");
			IUnitOfWork unitOfWork = _usuarioRepository.StoreContext;
			_usuarioRepository.Add(usuario);
			try
			{
				unitOfWork.Commit();
			}
			catch (OptimisticConcurrencyException)
			{
				unitOfWork.RollbackChanges();
				unitOfWork.CommitAndRefreshChanges();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="usuario"></param>
		public void ChangeUsuario(Entities.Usuario usuario)
		{
			if (usuario == null)
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "usuario");
			IUnitOfWork unitOfWork = _usuarioRepository.StoreContext;
			_usuarioRepository.Modify(usuario);
			try
			{
				unitOfWork.Commit();
			}
			catch (OptimisticConcurrencyException)
			{
				unitOfWork.RollbackChanges();
				unitOfWork.CommitAndRefreshChanges();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="juntaGuid"></param>
		/// <returns></returns>
		public List<Entities.Usuario> FindUsuariosByJunta(Guid juntaGuid)
		{
			if (juntaGuid == Guid.Empty)
				throw new ArgumentException(Messages.exception_InvalidArgument, "juntaGuid");
			UsuariosByJuntaSpecification specification = new UsuariosByJuntaSpecification(juntaGuid);
			return _usuarioRepository.FindUsuariosByJunta(specification).ToList();
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="estadoGuid"></param>
		/// <returns></returns>
		public List<Entities.Usuario> FindUsuariosByEstado(Guid estadoGuid)
		{
			if (estadoGuid == Guid.Empty)
				throw new ArgumentException(Messages.exception_InvalidArgument, "estadoGuid");
			UsuariosByEstadoSpecification specification = new UsuariosByEstadoSpecification(estadoGuid);
			return _usuarioRepository.FindUsuariosByEstado(specification).ToList();
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="padron"></param>
		/// <param name="subPadron"></param>
		/// <param name="control"></param>
		/// <returns></returns>
		public Entities.Usuario FindUsuarioByPadron(string padron, string subPadron, string control)
		{
			if (string.IsNullOrEmpty(padron))
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "padron");
			if (string.IsNullOrEmpty(subPadron))
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "subPadron");
			if (string.IsNullOrEmpty(control))
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "control");
			UsuarioByPadronSpecification specification = new UsuarioByPadronSpecification(padron, subPadron, control);
			return _usuarioRepository.FindUsuarioByPadron(specification);
		}

		#endregion

		#region IDisposable Members

		public void Dispose()
		{
			if (_usuarioRepository != null && _usuarioRepository.StoreContext != null)
				_usuarioRepository.StoreContext.Dispose();
		}

		#endregion
	}
}
